home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr26 / netprog.zip / NETPROG.TAR / ipc / mainshmserv.c < prev    next >
C/C++ Source or Header  |  1989-12-17  |  3KB  |  103 lines

  1. #include    <stdio.h>
  2. #include    <sys/types.h>
  3. #include    <sys/ipc.h>
  4. #include    <sys/shm.h>
  5.  
  6. #include    "shm.h"
  7.  
  8. int    shmid, clisem, servsem;    /* shared memory and semaphore IDs */
  9. Mesg    *mesgptr;        /* ptr to message structure, which is
  10.                    in the shared memory segment */
  11.  
  12. main()
  13. {
  14.     /*
  15.      * Create the shared memory segment, if required,
  16.      * then attach it.
  17.      */
  18.  
  19.     if ( (shmid = shmget(SHMKEY, sizeof(Mesg), PERMS | IPC_CREAT)) < 0)
  20.         err_sys("server: can't get shared memory");
  21.     if ( (mesgptr = (Mesg *) shmat(shmid, (char *) 0, 0)) == (Mesg *) -1)
  22.         err_sys("server: can't attach shared memory");
  23.  
  24.     /*
  25.      * Create two semaphores.  The client semaphore starts out at 1
  26.      * since the client process starts things going.
  27.      */
  28.  
  29.     if ( (clisem = sem_create(SEMKEY1, 1)) < 0)
  30.         err_sys("server: can't create client semaphore");
  31.     if ( (servsem = sem_create(SEMKEY2, 0)) < 0)
  32.         err_sys("server: can't create server semaphore");
  33.  
  34.     server();
  35.  
  36.     /*
  37.      * Detach the shared memory segment and close the semaphores.
  38.      * The client is the last one to use the shared memory, so
  39.      * it'll remove it when it's done.
  40.      */
  41.  
  42.     if (shmdt(mesgptr) < 0)
  43.         err_sys("server: can't detach shared memory");
  44.  
  45.     sem_close(clisem);
  46.     sem_close(servsem);
  47.  
  48.     exit(0);
  49. }
  50.  
  51. server()
  52. {
  53.     int    n, filefd;
  54.     char    errmesg[256], *sys_err_str();
  55.  
  56.     /*
  57.      * Wait for the client to write the filename into shared memory.
  58.      */
  59.  
  60.     sem_wait(servsem);    /* we'll wait here for client to start things */
  61.  
  62.     mesgptr->mesg_data[mesgptr->mesg_len] = '\0';
  63.                     /* null terminate filename */
  64.  
  65.     if ( (filefd = open(mesgptr->mesg_data, 0)) < 0) {
  66.         /*
  67.          * Error.  Format an error message and send it back
  68.          * to the client.
  69.          */
  70.  
  71.         sprintf(errmesg, ": can't open, %s\n", sys_err_str());
  72.         strcat(mesgptr->mesg_data, errmesg);
  73.         mesgptr->mesg_len = strlen(mesgptr->mesg_data);
  74.         sem_signal(clisem);        /* send to client */
  75.         sem_wait(servsem);        /* wait for client to process */
  76.  
  77.     } else {
  78.         /*
  79.          * Read the data from the file right into shared memory.
  80.          * The -1 in the number-of-bytes-to-read is because some
  81.          * Unices have a bug if you try and read into the final byte
  82.          * of a shared memory segment.
  83.          */
  84.  
  85.         while ( (n = read(filefd, mesgptr->mesg_data,
  86.                             MAXMESGDATA-1)) > 0) {
  87.             mesgptr->mesg_len = n;
  88.             sem_signal(clisem);    /* send to client */
  89.             sem_wait(servsem);    /* wait for client to process */
  90.         }
  91.         close(filefd);
  92.         if (n < 0)
  93.             err_sys("server: read error");
  94.     }
  95.  
  96.     /*
  97.      * Send a message with a length of 0 to signify the end.
  98.      */
  99.  
  100.     mesgptr->mesg_len = 0;
  101.     sem_signal(clisem);
  102. }
  103.